home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / vdisk.aqm / vdisk.asm
Assembly Source File  |  1983-03-19  |  9KB  |  373 lines

  1.  
  2. ; This is the DOS 2.0 ELECTRONIC DISK from the example in the DOS 2.0
  3. ; manual. It is now set for 180K of space. Look for the ======> 2 locations
  4. ; to change the size.
  5. ;
  6. ; To include the drive into your system, edit a file called CONFIG.SYS. It
  7. ; does not exist on the system supplied by IBM. Create a new file, and type
  8. ; in   DEVICE=VDISK.COM
  9. ;  and save the file  (must be standard ASCII fornat!).
  10. ; make sure you copy VDISK.COM to your boot disk.
  11. ; When you boot, the number of disk drives will be determined from the
  12. ; switch setting and the ELECTRONIC DIDK will be made the next drive letter.
  13. ;
  14. ; For example, if you have two floppies, the RAM DISK will be Drive C.
  15. ;
  16. ;
  17. ; Assemble this will MASM and link with LINK pgm.
  18. ; You must then use the EXE2BIN command,  type   EXE2BIN VDISK VDIDK
  19. ; after that, you must rename the new file  RENAME VDIDK.BIN VDISK.COM
  20. ;
  21. cseg    segment para public 'code'
  22. status  macro   state,err,rc
  23.         ifidn   <state>,<done>
  24.         or      es:word ptr srh_sta_fld[bx],0100h
  25.         endif
  26.         ifidn   <state>,<busy>
  27.         or      es:word ptr srh_sta_fld[bx],0200h
  28.         endif
  29.         ifidn   <err>,<error>
  30.         or      es:word ptr srh_sta_fld[bx],1000h
  31.         endif
  32.         ifnb    <rc>
  33.         or      es:word ptr srh_sta_fld[bx],rc
  34.         endif
  35.         endm
  36. ;
  37. ;
  38. ;
  39. srh     equ     0
  40. srh_len equ     13
  41. srh_len_fld     equ     srh
  42. srh_ucd_fld     equ     srh+1
  43. srh_ccd_fld     equ     srh+2
  44. srh_sta_fld     equ     srh+3
  45. srh_res_fld     equ     srh+5
  46. ;
  47. md      equ     srh+srh_len
  48. md_len  equ     1
  49. dta     equ     md+md_len
  50. dta_len equ     4
  51. count   equ     dta+dta_len
  52. count_len       equ     2
  53. ssn     equ     count+count_len
  54. ssn_len equ     2
  55. ;
  56. ret_byte        equ     md+md_len
  57. ;
  58. bpba_ptr        equ     dta+dta_len
  59. bpda_ptr_len    equ     4
  60. ;
  61. units   equ     srh+srh_len
  62. units_len       equ     1
  63. br_addr_0       equ     units+units_len
  64. br_addr_1       equ     br_addr_0+2
  65. br_addr_len     equ     4
  66. bpb_ptr_off     equ     br_addr_0+br_addr_len
  67. bpb_ptr_seg     equ     bpb_ptr_off+2
  68. ;
  69. vdsk    proc    far
  70.         assume  cs:cseg,es:cseg,ds:cseg
  71. begin:
  72. start   equ     $
  73. ;
  74. next_dev        dd      -1
  75. attribute       dw      2000h
  76. strategy        dw      dev_strategy
  77. interrupt       dw      dev_int
  78. dev_name        db      1
  79.         db      7 dup(?)
  80. ;
  81. rh_off  dw      ?rh_seg  dw      ?;
  82. bpb     equ     $
  83.         dw      512
  84.         db      1
  85.         dw      1
  86.         db      2
  87.         dw      64
  88.         dw      360
  89.         db      0fch
  90.         dw      2
  91. ;
  92. bpb_ptr dw      bpb
  93. ;
  94. ; current virtual disk information
  95. ;
  96. total   dw      ?verify  db      0
  97. start_sec       dw      0
  98. vdisk_ptr       dw      0
  99. user_dta        dd      ?boot_rec        equ     $
  100.         db      3 dup(0)
  101.         db      'IBM  2.0'
  102.         dw      512
  103.         db      1
  104.         dw      1
  105.         db      2
  106.         dw      64
  107.         dw      360
  108.         db      0fch
  109.         dw      2
  110. ;
  111. ;
  112. funtab  label   byte
  113.         dw      init
  114.         dw      media_check
  115.         dw      build_bpb
  116.         dw      ioctl_in
  117.         dw      input
  118.         dw      nd_input
  119.         dw      in_stat
  120.         dw      in_flush
  121.         dw      output
  122.         dw      out_verify
  123.         dw      out_stat
  124.         dw      out_flush
  125.         dw      ioctl_out
  126. ;
  127. ;
  128. in_save proc    near
  129.         mov     ax,es:word ptr dta[bx]
  130.         mov     cs:user_dta,ax
  131.         mov     ax,es:word ptr dta+2[bx]
  132.         mov     cs:user_dta+2,ax
  133.         mov     ax,es:word ptr count[bx]
  134.         xor     ah,ah
  135.         mov     cs:total,ax
  136.         ret
  137. in_save endp
  138. ;
  139. calc_addr       proc    near
  140.         mov     ax,cs:start_sec
  141.         mov     cx,20h
  142.         mul     cx
  143.         mov     dx,cs:vdisk_ptr
  144.         add     dx,ax
  145.         mov     ds,dx
  146.         xor     si,si
  147.         mov     ax,cs:total
  148.         mov     cx,512
  149.         mul     cx
  150.         or      ax,ax
  151.         jnz     move_it
  152.         mov     ax,0ffffh
  153. move_it:
  154.         xchg    cx,ax
  155.         ret
  156. calc_addr       endp
  157. ;
  158. sector_read proc near
  159.         call    calc_addr
  160.         mov     es,cs:user_dta+2
  161.         mov     di,cs:user_dta
  162. ;
  163.         mov     ax,di
  164.         add     ax,cx
  165.         jnc     read_copy
  166.         mov     ax,0ffffh
  167.         sub     ax,di
  168.         mov     cx,ax
  169. read_copy:
  170. rep     movsb
  171.         ret
  172. sector_read endp
  173. ;
  174. sector_write proc near
  175.         call    calc_addr
  176.         push    ds
  177.         pop     es
  178.         mov     di,si
  179.         mov     ds,cs:user_dta+2
  180.         mov     si,cs:user_dta
  181. ;
  182. ;
  183.         mov     ax,si
  184.         add     ax,cx
  185.         jnc     write_copy
  186.         mov     ax,0ffffh
  187.         sub     ax,si
  188.         mov     cx,ax
  189. write_copy:
  190. rep     movsb
  191.         ret
  192. sector_write endp
  193. ;
  194. dev_strategy:
  195.         mov     cs:rh_seg,es
  196.         mov     cs:rh_off,bx
  197.         ret
  198. ;
  199. ;
  200. ;
  201. dev_int:
  202.         cld
  203.         push    ds
  204.         push    es
  205.         push    ax
  206.         push    bx
  207.         push    cx
  208.         push    dx
  209.         push    di
  210.         push    si
  211. ;
  212. ;
  213.         mov     al,es:[bx]+2
  214.         rol     al,1
  215.         lea     di,funtab
  216.         xor     ah,ah
  217.         add     di,ax
  218.         jmp     word ptr[di]
  219. ;
  220. ;
  221. init:
  222.         push    cs
  223.         pop     dx
  224.         lea     ax,cs:vdisk
  225.         mov     cl,4
  226.         ror     ax,cl
  227.         add     dx,ax
  228.         mov     cs:vdisk_ptr,dx
  229.         mov     ax,2d00h
  230.         add     dx,ax
  231.         mov     es:word ptr br_addr_0[bx],0
  232.         mov     es:br_addr_1[bx],dx
  233.         mov     es:byte ptr units[bx],1
  234.         lea     dx,bpb_ptr
  235.         mov     es:bpb_ptr_off[bx],dx
  236.         mov     es:bpb_ptr_seg[bx],cs
  237.         mov     es,cs:vdisk_ptr
  238.         xor     di,di
  239.         lea     si,boot_rec
  240.         mov     cx,24
  241. rep     movsb
  242.         mov     cs:word ptr start_sec,1
  243.         mov     cs:word ptr total,2
  244.         call    calc_addr
  245.         push    ds
  246.         pop     es
  247.         mov     di,si
  248.         xor     al,al
  249. rep     stosb
  250.         mov     ds:byte ptr [si],0fch
  251.         mov     ds:byte ptr 1[si],0ffh
  252.         mov     ds:byte ptr 2[si],0ffh
  253.         push    ds
  254.         push    si
  255.         mov     cs:word ptr start_sec,3
  256.         mov     cs:word ptr total,2
  257.         call    calc_addr
  258.         push    ds
  259.         pop     es
  260.         mov     di,si
  261.         pop     si
  262.         pop     ds
  263. rep     movsb
  264.         mov     cs:word ptr start_sec,5
  265.         mov     cs:word ptr total,4
  266.         call    calc_addr
  267.         xor     al,al
  268.         push    ds
  269.         pop     es
  270.         xor     di,di
  271. rep     stosb
  272.         mov     es,cs:rh_seg
  273.         mov     bx,cs:rh_off
  274.         status  done,moerror,0
  275.         jmp     exit
  276. ;
  277. ;
  278. media_check:
  279.         mov     es:byte ptr ret_byte[bx],1
  280.         status  done,moerror,0
  281.         jmp     exit
  282. ;
  283. ;
  284. ;
  285. build_bpb:
  286.         push    es
  287.         push    bx
  288.         mov     cs:word ptr start_sec,0
  289.         mov     cs:word ptr total,1
  290.         call    calc_addr
  291.         push    cs
  292.         pop     es
  293.         lea     di,bpb
  294.         add     si,11
  295.         mov     cx,13
  296. rep     movsb
  297.         pop     bx
  298.         pop     es
  299.         lea     dx,bpb
  300.         mov     es:bpba_ptr[bx],dx
  301.         mov     es:bpba_ptr+2[bx],cs
  302.         mov     es:dta[bx],dx
  303.         mov     es:dta+2[bx],cs
  304.         status  done,moerror,0
  305.         jmp     exit
  306. ;
  307. ;
  308. ioctl_in:
  309. ioctl_out:
  310. nd_input:
  311. in_stat:
  312. in_flush:
  313. out_stat:
  314. out_flush:
  315. ;
  316. input:
  317.         call    in_save
  318.         mov     ax,es:word ptr ssn[bx]
  319.         mov     cs:start_sec,ax
  320.         mov     ax,es:word ptr count[bx]
  321.         mov     cs:total,ax
  322.         call    sector_read
  323.         mov     bx,cs:rh_off
  324.         mov     es,cs:rh_seg
  325.         status  done,moerror,0
  326.         jmp     exit
  327. ;
  328. ;
  329. output:
  330.         call    in_save
  331.         mov     ax,es:word ptr ssn[bx]
  332.         mov     cs:start_sec,ax
  333.         mov     ax,es:word ptr count[bx]
  334.         mov     cs:total,ax
  335.         call    sector_write
  336.         mov     bx,cs:rh_off
  337.         mov     es,cs:rh_seg
  338.         cmp     cs:byte ptr verify,0
  339.         jz      no_verify
  340.         mov     cs:byte ptr verify,0
  341.         jmp     input
  342. no_verify:
  343.         status  done,moerror,0
  344.         jmp     exit
  345. out_verify:
  346.         mov     cs:byte ptr verify,1
  347.         jmp     output
  348. ;
  349. ;
  350. exit:
  351.         pop     si
  352.         pop     di
  353.         pop     dx
  354.         pop     cx
  355.         pop     bx
  356.         pop     ax
  357.         pop     es
  358.         pop     ds
  359.         ret
  360. e_q_p:
  361.  if ($-start) mod 16
  362.  org ($-start)+16-(($-start) mod 16)
  363.  endif
  364. vdisk   equ     $
  365. vdsk    endp
  366. cseg    ends
  367.         end     begin
  368.                                                                        
  369.                                                                        
  370.                                                                        
  371.                                                                        
  372.                                                                        
  373.